package com.jay.protocol;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 协议消息结构
 * 用于封装网络通信中的请求或响应数据
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProtocolMessage<T> {

    /**
     * 消息头
     * 包含了消息的元数据信息，如魔数、版本号等
     */
    private Header header;

    /**
     * 消息体（请求或响应对象）
     * 具体的业务数据，类型由T指定，通过序列化器序列化
     */
    private T body;

    /**
     * 协议消息头
     * 包含了消息的各种属性，用于保证消息的正确性和安全性
     */
    @Data
    public static class Header {

        /**
         * 魔数，保证安全性
         * 用于标识消息格式，防止恶意数据包的攻击
         */
        private byte magic;

        /**
         * 版本号
         * 指定消息格式的版本，用于兼容性管理
         */
        private byte version;

        /**
         * 序列化器
         * 标识使用的序列化方式，以便接收方能够正确反序列化
         */
        private byte serializer;

        /**
         * 消息类型（请求 / 响应）
         * 用于标识消息是请求还是响应
         */
        private byte type;

        /**
         * 状态
         * 表示消息处理的状态，用于标识消息是否成功处理
         */
        private byte status;

        /**
         * 请求 id
         * 唯一标识一个请求，用于跟踪请求和响应的匹配
         */
        private long requestId;

        /**
         * 消息体长度
         * 指定消息体的长度，用于网络传输时确定消息边界
         */
        private int bodyLength;
    }

}

